package LoginSystem;

import java.util.*;

public class LoginSystem {
    /**
     * 登录系统入口
     *
     * @param args
     */
    public static void main(String[] args) {
        Map<String,Account> accounts = new HashMap<>();
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("========登录系统界面========");
            System.out.println("[1]-登录账号");
            System.out.println("[2]-注册账号");
            System.out.println("[3]-忘记密码");
            System.out.println("[4]-退出系统");
            System.out.println("请输入操作命令：");
            int command = sc.nextInt();
            switch (command) {
                case 1:
                    loginAccount(accounts, sc);
                    break;
                case 2:
                    registerAccount(accounts, sc);
                    break;
                case 3:
                    retrievePassword(accounts, sc);
                    break;
                case 4:
                    System.out.println("欢迎下次使用~");
                    return;
                default:
                    System.out.println("您输入的操作命令有误，请重新输入！");
                    break;
            }
        }
    }

    /**
     * 登录账号功能
     *
     * @param accounts 账号集合
     * @param sc       扫描器
     */
    private static void loginAccount(Map<String,Account> accounts, Scanner sc) {
        Account acc = new Account();
        System.out.println("========登录账号界面========");
        if (accounts.size() == 0) {
            System.out.println("当前账号集合中没有任何账号，请先注册账号！");
            return;
        }
        while (true) {
            System.out.println("请输入您的账号用户名：");
            String username = sc.next();
            acc = searchByUsername(username, accounts);
            if (acc == null) {
                System.out.println("该用户名不存在!若重新输入请输入[1]；若返回菜单请输入[0]");
                int flag=sc.nextInt();
                if(flag==0){
                    return;
                }else{
                    continue;
                }
            }
            System.out.println("请输入您的账号密码：");
            String password = sc.next();
            if (acc.getPassword().equals(password)) {
                System.out.println("你好！" + acc.getUserName());//登录成功
                return;
            } else {
                System.out.println("您输入的用户名或密码错误!若重新输入请输入[1]；若返回菜单请输入[0]");
                int flag=sc.nextInt();
                if(flag==0){
                    return;
                }
            }
        }
    }

    /**
     * 密码找回功能
     *
     * @param accounts 账号集合
     * @param sc       扫描器
     */
    private static void retrievePassword(Map<String,Account> accounts, Scanner sc) {
        System.out.println("========找回密码界面========");
        System.out.println("请输入账号的用户名：");
        String username = sc.next();
        Account acc = new Account();
        acc = searchByUsername(username, accounts);
        if (acc == null) {
            System.out.println("该用户名不存在！");
            return;
        }
        System.out.println("请输入账号信息中的真实姓名：");
        String realName = sc.next();
        if (!acc.getRealName().equals(realName)) {//判断真实姓名是否正确
            System.out.println("您输入的真实姓名不正确！");
            return;
        }
        System.out.println("请输入账号信息中身份证号的后六位：");
        String idNumber = sc.next();
        String verification = acc.getIDNumber().substring(12);//截取身份证号后六位
        if (!verification.equals(idNumber)) {//判断身份证号后六位是否正确
            System.out.println("您输入的身份证号后六位不正确！");
            return;
        }
        System.out.println("身份认证通过！");
        System.out.println("修改密码");
        while (true) {
            System.out.println("请输入新的账号密码：");
            String password = sc.next();
            System.out.println("请再次确认您的密码：");
            String okPassword = sc.next();
            if (password.equals(okPassword)) {
                acc.setPassword(okPassword);
                break;
            } else {
                System.out.println("您的两次密码输入不一致，请重新输入密码！");
            }
        }
    }

    /**
     * 注册账号功能
     *
     * @param accounts 账号集合
     * @param sc       扫描器
     */
    private static void registerAccount(Map<String,Account> accounts, Scanner sc) {
        Account acc = new Account();
        System.out.println("========注册账号界面========");
        while (true) {
            System.out.println("请输入您的用户名：");
            String username = sc.next();
            if (accounts.size() == 0) {//账号集合内没有账号
                acc.setUserName(username);
                break;
            } else {//账号集合内有账号
                Account account = searchByUsername(username, accounts);//判断账号集合中是否有该用户名
                if (account == null) {
                    acc.setUserName(username);
                    break;
                } else {
                    System.out.println("已存在该用户名!若重新输入请输入[1]；若返回菜单请输入[0]");
                    int flag=sc.nextInt();
                    if(flag==0){
                        return;
                    }
                }
            }
        }
        System.out.println("请输入您的真实姓名：");
        String realName = sc.next();
        String IDNumber = null;
        while (true) {
            System.out.println("请输入您的身份证号：");
            IDNumber = sc.next();
            if (!IDNumber.matches("^[1-9][0-9]{16}[0-9Xx]")) {//用正则表达式判断身份证号是否符合格式
                System.out.println("请输入18位有效身份证号码！若重新输入请输入[1]；若返回菜单请输入[0]");
                int flag=sc.nextInt();
                if(flag==0){
                    return;
                }
            } else {
                break;
            }
        }
        Account account = new Account();
        account = searchByIDNumber(IDNumber, accounts);//判断该身份信息是否已经被注册
        if (account != null) {
            System.out.println("您的身份信息已被注册！");
            System.out.println("您的身份信息注册的账号用户名为" + account.getUserName());
            return;
        } else {
            acc.setRealName(realName);
            acc.setIDNumber(IDNumber);
        }
        while (true) {
            System.out.println("请输入您的账号密码：");
            String password = sc.next();

            System.out.println("请再次确认您的密码：");
            String okPassword = sc.next();
            if (password.equals(okPassword)) {
                acc.setPassword(okPassword);
                break;
            } else {
                System.out.println("您的两次密码输入不一致，请重新输入密码！");
            }
        }
        accounts.put(acc.getUserName(), acc);
        System.out.println("注册成功！");
        return;
    }

    /**
     * 根据身份证号码查找账号
     *
     * @param idNumber 身份证号码
     * @param accounts 账号集合
     * @return Account / null
     */
    private static Account searchByIDNumber(String idNumber, Map<String,Account> accounts) {
        Account acc = new Account();
        Set<String> userNames = accounts.keySet();//获取键的集合
        for(String names:userNames){//通过键遍历Map
            acc=accounts.get(names);
            if (acc.getIDNumber().equals(idNumber)) {
                return acc;
            }
        }
        return null;
    }

    /**
     * 根据用户名查找账号功能
     *
     * @param username 用户名
     * @param accounts 账号集合
     * @return Account / null
     */
    private static Account searchByUsername(String username, Map<String,Account> accounts) {
        Account acc = new Account();
        acc=accounts.get(username);//直接用键（用户名）查找
        return acc;
    }
}
